package com.ybbase.framework.service.flow;

import com.ybbase.framework.model.po.flow.NodeUsergroup;
import com.ybbase.framework.model.po.system.User;
import com.ybbase.framework.model.vo.BusinessEntityVO;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.task.Task;

import java.util.List;
import java.util.Map;

/**
 * @author cg
 * @date 2019-09-02 10:45
 * @DEC 流程基础服务类
 */

public interface BaseFlowService {

    /**
     * 根据类型获取当前部署的流程列表
     *
     * @param category 类型
     * @return List<ProcessDefinition>
     * @author cg
     * @date 2019-09-02 15:37
     */
    List<ProcessDefinition> getPDListByPDCategory(String category);

    /**
     * 根据流程定义ID获取当前部署的流程列表
     *
     * @param processDefinitionId 流程定义ID
     * @return List<ProcessDefinition>
     * @author cg
     * @date 2019-09-02 15:39
     */
    List<ProcessDefinition> getPDListByPDId(String processDefinitionId);

    /**
     * 根据流程定义ID启动工作流
     *
     * @param processDefinitionId 流程定义ID
     * @param querys              代办组或者待办人 格式 users:******* (条件)
     * @param businessEntityVO    业务实体
     * @param user                用户信息
     * @return String 流程实例ID
     * @author cg
     * @date 2019-09-02 15:45
     * @since 4.0
     */
    String startActivit(String processDefinitionId, Map<String, Object> querys, User user, BusinessEntityVO businessEntityVO);

    /**
     * 启动审批流程
     * @param businessId   业务ID
     * @param businessName 业务Name
     * @param flowCode     流程编码
     * @param orgFlowType  组织机构流程代码
     * @param user         用户信息
     * @return
     * @author cg
     * @date 2019-09-26 19:46
     * @since 4.0
     */
    void startBaseFlow(String businessId, String businessName, String flowCode, String orgFlowType, User user);
    /**
     * 查询流程节点的审核人和审核组信息
     * @param list 流程节点和审核人对照表
     * @return
     * @author cg
     * @date 2019-09-26 19:31
     * @since 4.0
     */
    Map<String, Object> getTaskUserGroupQuerys(List<NodeUsergroup> list,List<String> taskCodes);
    /**
     * 根据类型更新挂起状态
     *
     * @param state             类型
     * @param processInstanceId 实例编码
     * @param businessEntityVO  业务类
     * @return >0 更新成功 -1
     * @author cg
     * @date 2019-09-03 17:38
     */
    int updateStatus(String state, String processInstanceId, BusinessEntityVO businessEntityVO);

    /**
     * 根据实例ID获取工作流所处的位置
     *
     * @param instanceId 流程实例ID
     * @return String 流程节点ID
     * @author cg
     * @date 2019-09-02 15:48
     */
    String getActivitiNow(String instanceId);

    /**
     * 根据实例ID验证工作流是不是已经停止
     *
     * @param instanceId 工作流id
     * @return Boolean true:已经停止,false:没有停止
     * @author cg
     * @date 2019-09-02 15:49
     */
    Boolean validateActiviti(String instanceId);

    /**
     * 根据用户编码验证用户是否处于该工作流的当前任务组 group  user  assignee 都查
     *
     * @param userId 用户ID
     * @return Boolean true:处于,false:不处于
     * @author cg
     * @date 2019-09-02 15:50
     */
    Boolean validateUserIn(String userId);

    /**
     * 根据用户编码获取用户当前处于的任务集合 group  user  assignee 都查
     *
     * @param userId 用户ID
     * @return List<Task> 任务集合
     * @author cg
     * @date 2019-09-02 15:51
     */
    List<Task> getUserHaveTasks(String userId);

    /**
     * 根据用户编码获取用户当前处于的任务id集合   group  user  assignee 都查
     *
     * @param userId 用户
     * @return List<String> 任务id集合
     * @author cg
     * @date 2019-09-02 15:52
     */
    List<String> getUserHaveTaskIds(String userId);

    /**
     * 根据用户编码获取用户当前处于签收人的任务集合 只查Assignee
     *
     * @param userId 用户
     * @return List<Task>任务集合
     * @author cg
     * @date 2019-09-02 15:54
     */
    List<Task> getUserHaveTasksAssignee(String userId);

    /**
     * 根据用户编码获取当前用户处于签收人的工作流id集合 只查assignee
     *
     * @param userId 用户
     * @return List<String> 流程实例ID集合
     * @author cg
     * @date 2019-09-02 15:56
     */
    List<String> getUserHaveActivitiIdsAssignee(String userId);

    /**
     * 根据用户编码获取用户当前处于签收人的任务id集合 只查Assignee
     *
     * @param userId 用户ID
     * @return List<String>任务id集合
     * @author cg
     * @date 2019-09-02 15:59
     */
    List<String> getUserHaveTasksIdsAssignee(String userId);

    /**
     * 根据用户编码获取用户当前处于待办人的任务集合 只查Group
     *
     * @param userId 用户ID
     * @return List<Task>任务集合
     * @author cg
     * @date 2019-09-02 16:02
     */
    List<Task> getUserHaveTasksGroup(String userId);

    /**
     * 根据用户编码获取用户当前处于待办人的任务id集合 只查Group
     *
     * @param userId 用户ID
     * @return List<String>任务id集合
     * @author cg
     * @date 2019-09-02 16:03
     */
    List<String> getUserHaveTasksIdsGroup(String userId);

    /**
     * 根据用户编码获取当前用户处于待办人的工作流id集合 只查group
     *
     * @param userId 用户
     * @return List<String>流程实例集合
     * @author cg
     * @date 2019-09-02 16:04
     */
    List<String> getUserHaveActivitiIdsGroup(String userId);

    /**
     * 根据用户编码获取用户当前处于待办人的任务集合 只查user
     *
     * @param userId 用户
     * @return List<Task> 任务集合
     * @author cg
     * @date 2019-09-02 16:05
     */
    List<Task> getUserHaveTasksUser(String userId);

    /**
     * 根据用户编码获取当前用户处于待办人的工作流id集合 只查user
     *
     * @param userId 用户ID
     * @return List<String>流程实例集合
     * @author cg
     * @date 2019-09-02 16:07
     */
    List<String> getUserHaveActivitiIdsUser(String userId);

    /**
     * 根据用户编码获取用户当前处于待办人的任务id集合 只查Group
     *
     * @param userId 用户ID
     * @return List<String>任务id集合
     * @author cg
     * @date 2019-09-02 17:36
     */
    List<String> getUserHaveTasksIdsUser(String userId);

    /**
     * 根据流程实例ID获取当前工作流的当前任务列表
     *
     * @param instanceId 工作流id
     * @return List<Task> 当前任务列表
     * @author cg
     * @date 2019-09-02 17:42
     */
    List<Task> getInstanceTasks(String instanceId);

    /**
     * 根据流程实例ID获取当前工作流的当前任务id集合
     *
     * @param instanceId 工作流id
     * @return List<String> 当前任务id集合
     * @author cg
     * @date 2019-09-02 17:45
     */
    List<String> getInstanceTaskIds(String instanceId);

    /**
     * 根据实例ID和用户编码获取当前工作流的该用户的当前任务 只查了 group 和 assignee
     *
     * @param instanceId 工作流id
     * @param userId     用户id
     * @return List<Task> 当前任务集合
     * @author cg
     * @date 2019-09-02 17:46
     */
    List<Task> getInstanceUserTasks(String instanceId, String userId);

    /**
     * 根据实例ID和用户编码获取当前工作流的该用户的当前任务id集合 只查了 group 和 assignee
     *
     * @param instanceId 工作流id
     * @param userId     用户id
     * @return List<String>当前任务id集合
     * @author cg
     * @date 2019-09-02 17:48
     */
    List<String> getInstanceUserTaskIds(String instanceId, String userId);

    /**
     * 获取当前工作流的该用户的当前任务id集合  查了 group 和 assignee user
     *
     * @param instanceId 工作流id
     * @param userId     用户id
     * @param role       角色或者 继续放入 userId
     * @return List<String> 当前任务id集合
     * @author cg
     * @date 2019-09-02 17:49
     */
    List<String> getInstanceUserTaskIds(String instanceId, String userId, String role);

    /**
     * 根据工作流id、用户id、角色编码（或者 继续放入 userId）获取当前工作流的该用户的当前任务 查了 group 和 assignee user
     *
     * @param instanceId 工作流id
     * @param userId     用户id
     * @param role       角色或者 继续放入 userId
     * @return List<Task> 当前任务集合
     * @author cg
     * @date 2019-09-02 17:50
     */
    List<Task> getInstanceUserTasks(String instanceId, String userId, String role);

    /**
     * 获取工作流的当前任务的用户组  group user assignee
     *
     * @param instanceId 工作流实例id
     * @return Map<String, List < String>> key:taskId,value:用户集合
     * @author cg
     * @date 2019-09-02 17:52
     */
    Map<String, List<String>> getUserIdsMap(String instanceId);

    /**
     * 流程实例ID获取用户所处的任务id集合 根据groupId查找
     *
     * @param instanceId 流程实例ID
     * @param userId     用户组ID
     * @return List<String> 任务id集合
     * @author cg
     * @date 2019-09-02 17:54
     */
    List<String> getInstanceGroupTaskIds(String instanceId, String userId);

    /**
     * 获取用户所处的任务id集合 根据userId查找
     *
     * @param instanceId 实例ID
     * @param userId     用户ID
     * @return List<String> 任务id集合
     * @author cg
     * @date 2019-09-02 18:08
     */
    List<String> getInstanceUsersTaskIds(String instanceId, String userId);

    /**
     * 获取用户所处的任务id集合 根据Assignee查找
     *
     * @param instanceId 流程实例编码
     * @param userId     Assignee用户编码
     * @return List<String>任务id集合
     * @author cg
     * @date 2019-09-02 18:27
     */
    List<String> getInstanceAssigneeTaskIds(String instanceId, String userId);

    /**
     * 根据工作流实例id获取工作流的当前任务的所有用户组 groupId  userId  assignee
     *
     * @param instanceId 工作流实例id
     * @return List<List < String>> 表示当前任务可能不只有一个
     * @author cg
     * @date 2019-09-02 18:28
     */
    List<List<String>> getUserIds(String instanceId);

    /**
     * 根据流程实例编码获取工作流的当前任务的所有用户组 groupId  userId  assignee
     *
     * @param instanceId 工作流实例id
     * @return List<String>当前任务的所有用户组
     * @author cg
     * @date 2019-09-02 18:30
     */
    List<String> getUserIdsOneList(String instanceId);

    /**
     * 根据taskId进行完成任务
     *
     * @param taskId 任务id
     * @author cg
     * @date 2019-09-02 18:31
     */
    void completeTask(String taskId);

    /**
     * 根据任务编码和用户编码完成任务
     *
     * @param taskId 任务id
     * @param userId 用户id
     * @author cg
     * @date 2019-09-02 18:31
     */
    void completeTask(String taskId, String userId);

    /**
     * 根据任务编码和用户编码认领任务
     *
     * @param taskId 任务id
     * @param userId 用户id
     * @author cg
     * @date 2019-09-02 18:32
     */
    void claimTask(String taskId, String userId);

    /**
     * 根据流程实例编码查询是否结束
     *
     * @param instanceId 流程实例id
     * @return Boolean true流程实例结束了 false 实例未结束了
     * @author cg
     * @date 2019-09-02 18:33
     */
    Boolean validateEnd(String instanceId);

    /**
     * 获取用户id集合
     *
     * @param nameIds 切串用户编码集
     * @return List<String> 用户编码
     * @author cg
     * @date 2019-09-02 18:35
     */
    List<String> analysisUserId(String nameIds);

    /**
     * 修改变量
     *
     * @param activitiId 工作流id
     * @param variables  条件
     * @author cg
     * @date 2019-09-02 18:37
     */
    void setVar(String activitiId, Map<String, Object> variables);

    /**
     * 获取工作流的当前任务的groupId用户组
     *
     * @param instanceId 工作流实例id
     * @return List<List < String>> 表示当前任务可能不只有一个
     * @author cg
     * @date 2019-09-02 18:37
     */
    List<List<String>> getGroupUserIds(String instanceId);

    /**
     * 获取工作流的当前任务的groupId用户组
     *
     * @param instanceId 工作流实例id
     * @return List<String> groupId用户组
     * @author cg
     * @date 2019-09-02 18:38
     */
    List<String> getGroupUserIdsOneList(String instanceId);

    /**
     * 获取工作流的当前任务的userId用户组
     *
     * @param instanceId 工作流实例id
     * @return List<List < String>> 表示当前任务可能不只有一个
     * @author cg
     * @date 2019-09-02 18:50
     */
    List<List<String>> getUserUserIds(String instanceId);

    /**
     * 根据工作流实例id获取工作流的当前任务的userId用户组
     *
     * @param instanceId 工作流实例id
     * @return List<String> userId用户组
     * @author cg
     * @date 2019-09-02 18:51
     */
    List<String> getUserUserIdsOneList(String instanceId);

    /**
     * 根据任务task获取工作流的当前任务的groupId用户组
     *
     * @param task 工作流任务实体
     * @return List<String>groupId用户组
     * @author cg
     * @date 2019-09-02 18:52
     */
    List<String> getGroupUserIds(Task task);

    /**
     * 根据任务task获取工作流的当前任务的userId用户组
     *
     * @param task 工作流任务实体
     * @return List<List < String>> 表示当前任务可能不只有一个
     * @author cg
     * @date 2019-09-02 18:53
     */
    List<String> getUserUserIds(Task task);

    /**
     * 根据流程实例ID获取工作流的当前任务的assignee用户组
     *
     * @param instanceId 工作流实例id
     * @return List<String> 当前任务的assignee用户组
     * @author cg
     * @date 2019-09-02 18:54
     */
    List<String> getAssigneeUserIds(String instanceId);

    /**
     * 根据流程任务实体获取工作流的当前任务的assignee用户组
     *
     * @param task 工作流任务实体
     * @return List<List < String>> assignee用户组表示当前任务可能不只有一个
     * @author cg
     * @date 2019-09-02 18:56
     */
    String getAssigneeUserIds(Task task);

    /**
     * 设置组用户 放入groupId中
     *
     * @param ids  用户编码集
     * @param task 工作流任务实体
     * @author cg
     * @date 2019-09-02 19:10
     */
    void addGroupIds(List<String> ids, Task task);

    /**
     * 已办获取历史任务 查询用户处于签收人 assignee
     *
     * @param userId 用户编码
     * @return List<HistoricTaskInstance> 历史实例编码
     * @author cg
     * @date 2019-09-02 19:20
     */
    List<HistoricTaskInstance> getHistoryAssigneeActivitiIds(String userId);

    /**
     * 获取历史任务 查询用户处于签收人 assignee
     *
     * @param userId 用户编码
     * @return List<String> 历史签收的流程实例编码集
     * @author cg
     * @date 2019-09-02 19:21
     */
    List<String> getHistoryAssigneeActivitiIdsString(String userId);

    /**
     * 获取历史任务 查询用户处于已办组 group
     *
     * @param userId 用户组编码
     * @return List<HistoricTaskInstance> 历史实例编码集
     * @author cg
     * @date 2019-09-02 19:24
     */
    List<HistoricTaskInstance> getHistoryGroupActivitiIds(String userId);

    /**
     * 获取历史任务 查询用户处于代办组 group
     *
     * @param userId 用户组编码
     * @return List<String> 历史签收的流程实例编码集
     * @author cg
     * @date 2019-09-02 19:25
     */
    List<String> getHistoryGroupActivitiIdsString(String userId);

    /**
     * 获取历史流程实例 查询用户处于已办组 group
     *
     * @param userId 用户组编码
     * @return List<HistoricTaskInstance> 历史流程实例集
     * @author cg
     * @date 2019-09-02 19:26
     */
    List<HistoricTaskInstance> getHistoryUserActivitiIds(String userId);

    /**
     * 获取历史任务 查询用户处于已办组 group
     *
     * @param userId 用户组编码
     * @return List<String> 历史流程实例ID集
     * @author cg
     * @date 2019-09-02 19:28
     */
    List<String> getHistoryUserActivitiIdsString(String userId);

    /**
     * 根据流程代码和业务ID获取当前审核人ID
     * @param flowCode 流程代码
     * @param businessId 业务ID
     * @return String
     * @author cg
     * @date 2019-11-12 11:11
     * @since 4.0
     */
    String getFlowTaskAssignee(String flowCode, String businessId);

    /**
     * 根据当前登录用户的Id和业务编码获取业务编码集合
     * @param
     * @return
     * @author cg
     * @date 2019-12-17 21:36
     * @since cloud2.0
     */
    List<Integer> getBusinessId(String businessCode, String userId);
}
